type BaseType = number | string | boolean | null | undefined;

// 用于递归拷贝对象的函数
function deepCopyObject<T extends Record<string, any>>(obj: T): T {
  let copy: any = Array.isArray(obj) ? [] : {};

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      // 使用递归处理嵌套的对象和数组
      copy[key] = isObject(obj[key]) ? deepCopyObject(obj[key]) : obj[key];
    }
  }

  return copy as T;
}

// 判断一个值是否是对象（不包括数组和null）
function isObject(item: any): item is Record<string, any> {
  return item !== null && typeof item === "object" && !Array.isArray(item);
}

// 通用深拷贝函数
function deepCopy<T>(data: T): T {
  // 如果是基本类型或者函数，直接返回
  if (typeof data !== "object" || data === null || typeof data === "function") {
    return data;
  }

  // 如果是数组或对象，则递归拷贝
  return deepCopyObject(data as Record<string, any>) as T;
}

// 示例
const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
const copiedObj = deepCopy(obj);
console.log(copiedObj); // 输出与obj结构相同的新对象

// 测试基本类型
const num = 3;
const copiedNum = deepCopy(num);
console.log(copiedNum); // 输出3

export {};

export {};
